package fragments;

import java.io.IOException;
import java.net.SocketTimeoutException;
import java.util.ArrayList;
import java.util.Date;

import java.util.List;

import persistencia.BaseDatos;
import webService.AccesoWebService;

import com.androidmodule.onthego.R;
import com.facebook.Session;
import com.facebook.SessionState;
import com.facebook.UiLifecycleHelper;
import com.facebook.model.GraphObject;
import com.facebook.model.OpenGraphAction;
import com.facebook.model.OpenGraphObject;
import com.facebook.widget.FacebookDialog;

import entidades.Reserva;
import extras.Fonts;
import extras.Utilities;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import android.graphics.Bitmap;
public class FragmentReservaParticular extends Fragment{
	static final String TAG = "FACEBOOK";
	String sCodigoReserva;
	Reserva reserva;
	BaseDatos baseDeDatos;
	TextView cronometro,titulo,comercio,ubicacion,descuento, codigoReserva,aumento;
	TextView lblDescuento;
	ImageView imagen;
	CountDownTimer temporizadorTolerancia;
	OnReservaCaducadaListener ActivityListener;
	private UiLifecycleHelper uiHelper;
	
	public void onAttach(Activity activity){
		super.onAttach(activity);
		try{
			ActivityListener = (OnReservaCaducadaListener) activity;
		}
		catch(ClassCastException e){
			throw new ClassCastException ("No implementa interfaz");
		}
	}
	
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);

	    uiHelper = new UiLifecycleHelper(getActivity(), callback);
	    uiHelper.onCreate(savedInstanceState);
		baseDeDatos= new BaseDatos(getActivity().getApplicationContext());
		//cambiar
			
		    sCodigoReserva = getArguments().getString("codigo");
			reserva = baseDeDatos.getReserva(getArguments().getString("codigo"));
		
		
	}
	
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		if(container==null)
			return null;
		return inflater.inflate(R.layout.layout_reserva_particular,
				container, false);
	}
	
	public void onActivityCreated(Bundle savedInstanceState)
	{
		super.onActivityCreated(savedInstanceState);
		//
		TextView lblReservaExitosa = (TextView) getActivity().findViewById(R.id.etiqueta_reservaExitosa);
		lblReservaExitosa.setTypeface(Fonts.impact(getActivity().getApplicationContext()));
		TextView lblPreTiempoRestante = (TextView) getActivity().findViewById(R.id.etiqueta_reserva_pretiemprorestante);
		lblPreTiempoRestante.setTypeface(Fonts.mvboli(getActivity().getApplicationContext()));
		TextView lblTiempoRestante = (TextView) getActivity().findViewById(R.id.etiqueta_reservaTiempoRestante);
        lblTiempoRestante.setTypeface(Fonts.impact(getActivity().getApplicationContext())); 
		cronometro = (TextView) getActivity().findViewById(R.id.etiqueta_cronometroTolerancia);
		cronometro.setTypeface(Fonts.impact(getActivity().getApplicationContext()));
		TextView lblCanjeo = (TextView) getActivity().findViewById(R.id.etiqueta_reservaCanjeo);
		lblCanjeo.setTypeface(Fonts.arialNarrow(getActivity().getApplicationContext()));
		lblDescuento = (TextView) getActivity().findViewById(R.id.etiqueta_descuento);
		lblDescuento.setTypeface(Fonts.arialNarrow(getActivity()));
		lblDescuento.setVisibility(View.GONE);
		TextView lblCodigo = (TextView) getActivity().findViewById(R.id.etiqueta_codigo);
		lblCodigo.setTypeface(Fonts.arialNarrow(getActivity()));
		Button btnFacebook = (Button) getActivity().findViewById(R.id.btn_Send_Facebook);
		Button btnTwitt = (Button) getActivity().findViewById(R.id.btn_Send_Tweet);
		
		
		
		codigoReserva = (TextView) getActivity().findViewById(R.id.etiqueta_codigoReserva);
		codigoReserva.setTypeface(Fonts.impact(getActivity()));
		comercio = (TextView) getActivity().findViewById(R.id.etiqueta_comercioPromocion);
		comercio.setTypeface(Fonts.arialNarrow(getActivity()));
		titulo = (TextView) getActivity().findViewById(R.id.etiqueta_titulo_reserva);
		titulo.setTypeface(Fonts.mvboli(getActivity().getApplicationContext()));
		ubicacion = (TextView) getActivity().findViewById(R.id.etiqueta_ubicacion);
		ubicacion.setTypeface(Fonts.arialNarrow(getActivity()));
		descuento = (TextView) getActivity().findViewById(R.id.etiqueta_descuentoCantidad);
		descuento.setTypeface(Fonts.arialNarrow(getActivity()));
		aumento = (TextView) getActivity().findViewById(R.id.etiqueta_aumento_porPublicar);
		aumento.setVisibility(View.GONE);
		imagen = (ImageView) getActivity().findViewById(R.id.imagen_reservaParticular);
		btnFacebook.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View arg0) {
				publicarOnFace();
				
			}});
		
		btnTwitt.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View arg0) {
				publicarTwitter();
				
			}});
		
		//falta cronometro
	}

	public void onStart(){
		super.onStart();
		if(!reserva.getCodigo().equalsIgnoreCase("")){// si no tiene codigo quiere deir que no esta en la bd
		comercio.setText(reserva.getComercio());
		titulo.setText(reserva.getTituloProm());
		descuento.setText(reserva.getDescuento()+"%");
		if(reserva.getDifDescuentos()>0)
		{
			
			Utilities.makeToastLong(getActivity(), getActivity().getString(R.string.con_aumento_promocion));
			
		}
		
		codigoReserva.setText(reserva.getCodigo());
		
		if(reserva.getImagen()!=null){
			imagen.setImageBitmap(reserva.getImagenBitmap());
		}
		temporizadorTolerancia = temporizador(getTiempoRestante()).start();
		}
		else{
			cronometro.setText(R.string.etiqueta_reserva_eliminada);
		}
	}
	
	public void onPause(){
		super.onPause();
		uiHelper.onPause();
		if(temporizadorTolerancia!=null)
		temporizadorTolerancia.cancel();
	}
	
	public void onResume(){
		super.onResume();
		uiHelper.onResume();
	}
	@Override
	public void onDestroy() {
	    super.onDestroy();
	    uiHelper.onDestroy();
	}
	
	@Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        uiHelper.onSaveInstanceState(outState);
    }
	private void onSessionStateChange(Session session, SessionState state, Exception exception) {
	    if (state.isOpened()) {
	        Log.i(TAG, "Logged in...");
	    } else if (state.isClosed()) {
	        Log.i(TAG, "Logged out...");
	    }
	}
	
	private Session.StatusCallback callback = new Session.StatusCallback() {
	    @Override
	    public void call(Session session, SessionState state, Exception exception) {
	        onSessionStateChange(session, state, exception);
	    }
	};
	/** PARA FACEBOOK **/
	
	public void onActivityResult(int requestCode, int resultCode, Intent data) {
	    super.onActivityResult(requestCode, resultCode, data);
	    Utilities.makeToastLong(getActivity(), "hola!!!");
	    uiHelper.onActivityResult(requestCode, resultCode, data, new FacebookDialog.Callback() {
	        @Override
	        public void onError(FacebookDialog.PendingCall pendingCall, Exception error, Bundle data) {
	            Log.e("Activity", String.format("Error: %s", error.toString()));
	        }

	        @Override
	        public void onComplete(FacebookDialog.PendingCall pendingCall, Bundle data) {
	            Log.i("Activity", "Success!");
	            if(reserva.getOnFacebook()==Reserva.ON_REDSOCIAL_TRUE){
	            	
	            }
	            else{
	            	notificarPublicacionAServidor(getActivity().getApplicationContext(),true);
	            }
	            
	        }
	    });
	}
	
	
public void publicarOnFace(){
		
		if (FacebookDialog.canPresentShareDialog(getActivity().getApplicationContext(), 
                FacebookDialog.ShareDialogFeature.SHARE_DIALOG)) {
			
			
			OpenGraphObject prom = OpenGraphObject.Factory.createForPost("onthegost:promotion");
			prom.setProperty("title", reserva.getTituloProm()+" "+reserva.getDescuento()+" %");
			//prom.setProperty("image", "http://example.com/cooking-app/images/buffalo-tacos.png");
			//prom.setProperty("url", "https://example.com/cooking-app/meal/Buffalo-Tacos.html");
			prom.setProperty("description",reserva.getComercio() );
			
			OpenGraphAction action = GraphObject.Factory.create(OpenGraphAction.class);
			action.setProperty("promotion", prom);
			action.setType("onthegost:book");
			
			//
			//bitmap
			//List<Bitmap> images = new ArrayList<Bitmap>();
			//images.add(reserva.getImagenBitmap());
			//FacebookDialog shareDialog = new FacebookDialog.OpenGraphActionDialogBuilder(this, action, "onthegost:book", "onthegost:promotion")
			FacebookDialog shareDialog = new FacebookDialog.OpenGraphActionDialogBuilder(getActivity(), action, "promotion")
			//.setImageAttachmentsForAction(images, true)
			.build();


           uiHelper.trackPendingDialogCall(shareDialog.present());

} else {
	Utilities.makeToastLong(getActivity(), "Necesita la app de facebook");
}
}

public void publicarTwitter(){
	  if(reserva.getOnTwitter()==Reserva.ON_REDSOCIAL_TRUE){
      	
      }
      else{
      	notificarPublicacionAServidor(getActivity().getApplicationContext(),false);
      }
	
	String tweetUrl = "https://twitter.com/intent/tweet?text="+reserva.getTituloProm();
Uri uri = Uri.parse(tweetUrl);
startActivity(new Intent(Intent.ACTION_VIEW, uri));
}
	/////////////////////////
	public long getTiempoRestante(){
		return Utilities.getDateFromString(
				reserva.getHoraFin()).getTime() - new Date().getTime();
		
	}
	
	/* metodo para crear un temporizador, tiene como parametro el tiempo
	 * que restante para hacer la accion
	 */
	
	public CountDownTimer temporizador (long tiempoRestante){
		return new CountDownTimer(tiempoRestante, 1000) {

		     public void onTick(long millisUntilFinished) {
		    	
		    	 cronometro.setText(convertirTiempoAString(millisUntilFinished));  	
		     }
		     public void onFinish() {
		    	cronometro.setText(getString(R.string.etiqueta_tolerancia_acabada));
		    	ActivityListener.onNotificarReservaCaducada(reserva.getCodigo());
		     }
		  };
	}
	
	
	 /**
     * Este metodo devuele un vector de enteros con las horas, minutos
     * y segundos restantes. El metodo se basa en el principio de que las promociones
     * duran menos de un dia sino falla
     * @return
     */
    public int[] tiempoCronometro(long tiempoRestante){
    	int[] tiempo = new int [3];
    	long diffHoras = tiempoRestante / (60 * 60 * 1000);
    	tiempoRestante=tiempoRestante-(diffHoras*(60 * 60 * 1000));
    	long diffMinutes = tiempoRestante / (60 * 1000);
        tiempoRestante=tiempoRestante-(diffMinutes*(60 * 1000));
        long diffSeconds = tiempoRestante/ 1000;
        
        tiempo[0]=(int) diffHoras;
        tiempo[1]=(int) diffMinutes;
        tiempo[2]=(int) diffSeconds;
        
        return tiempo;
    }
    
    
    /**
     * Este metodo toma el vector de horas minutos y segundos
     * y lo transforma a string par amostrar el cronometro
     * @return
     */
    public String convertirTiempoAString(long tiempoRestante){
    	int[] tiempo = tiempoCronometro(tiempoRestante);
    	return agregar0(tiempo[0])+":"+agregar0(tiempo[1])+":"+agregar0(tiempo[2]);
    }
    
    public String agregar0(int tiempo){
    	String resultado = String.valueOf(tiempo);
    	if(tiempo<10){
    		resultado = "0"+resultado;
    	}
    	return resultado;
    }
	
	public interface OnReservaCaducadaListener{
		
		public void onNotificarReservaCaducada(String parametroCodigoReserva);
	}
	
	/**
	 * como no puedo capturar el onresutl dentro del fragmetn lo captuo en la actiity y comunico al fragmet
	 * @author Marco por lo tanto en el onresult de la activty padre llamo a este metodo
	 *
	 */
	
	
	public void facebookSubmited(int requestCode, int resultCode, Intent data){
		
		 uiHelper.onActivityResult(requestCode, resultCode, data, new FacebookDialog.Callback() {
		        @Override
		        public void onError(FacebookDialog.PendingCall pendingCall, Exception error, Bundle data) {
		            Log.e("Activity", String.format("Error: %s", error.toString()));
		        }

		        @Override
		        public void onComplete(FacebookDialog.PendingCall pendingCall, Bundle data) {
		            Log.i("Activity", "Success!");
		            if(reserva.getOnFacebook()==Reserva.ON_REDSOCIAL_TRUE){
		            	Utilities.makeToastLong(getActivity().getApplicationContext(),"Ya se le aplico el aumento" );
		            }
		            else{
		            	notificarPublicacionAServidor(getActivity().getApplicationContext(),true);
		            }
		            
		        }
		    });
	}
	
	
	//////////////metodo para notificar al servidor que se publico
	 public void notificarPublicacionAServidor(final Context contexto,final boolean tu){
	    	new AsyncTask<Void, Integer, String>() {
	            int codigoError= AccesoWebService.NO_ERROR;
	            boolean twitoface=tu;

	                @Override
	                protected String doInBackground(Void... params) { 
	                	 String resultado = "";
	                	 AccesoWebService webService = new AccesoWebService();
	                     try {
	                         resultado=webService.notificarPublicacionRedSocial(sCodigoReserva, (int)reserva.getDifDescuentos()/2);
	                     }
	                     catch(SocketTimeoutException time){
	                    	 codigoError=AccesoWebService.TIMEOUT_ERROR;
	                     }
	                     catch (IOException ex) {
	                         throw new RuntimeException();
	                     
	                     }
	                     return resultado;
	                }

	                protected void onProgressUpdate(Integer... values){}

	                protected void onPostExecute(String mensaje){
	                	if(codigoError==AccesoWebService.NO_ERROR){
	                		if("CORRECTO".equalsIgnoreCase(mensaje)){
	                			int descuentoBase = reserva.getDescuento();
	                			reserva.setDescuento((descuentoBase+reserva.getDifDescuentos()/2));
	                			if(twitoface)
	                			reserva.setOnFacebook(Reserva.ON_REDSOCIAL_TRUE);
	                			else
	                			reserva.setOnTwitter(Reserva.ON_REDSOCIAL_TRUE);	
	                			baseDeDatos.actualizarReserva(sCodigoReserva, reserva);
	                			descuento.setText(reserva.getDescuento()+"%");
	                			
	                		}
	                		
	                		
	                	}
	                	else{
	                          if(codigoError==AccesoWebService.TIMEOUT_ERROR){
	                        	  Toast.makeText(getActivity().getApplicationContext(), "No se puede Acceder al servidor", Toast.LENGTH_LONG).show();
	                        	  
	                          }
	                	}
	                	
	                }
	        }.execute();
	    }
}
